CBOW (Continuous Bag of Words) Embedding Abstrak#

Notebook ini menjelaskan implementasi CBOW embedding menggunakan Word2Vec untuk menganalisis teks abstrak penelitian. CBOW adalah salah satu arsitektur Word2Vec yang memprediksi kata target berdasarkan konteks kata-kata di sekitarnya.

Tujuan:#

  • Membuat embedding vektor untuk kata-kata dalam dataset abstrak penelitian

  • Menggunakan Word2Vec dengan arsitektur CBOW

  • Mengekstrak fitur numerik dari teks abstrak untuk analisis lebih lanjut

  • Menganalisis similaritas semantik antar abstrak penelitian

1. Instalasi Library#

Menginstal library yang diperlukan:

  • plotly: untuk visualisasi interaktif

  • gensim: library utama untuk Word2Vec dan embedding

%%capture
!pip install plotly
!pip install --upgrade gensim

2. Import Library dan Load Data#

Mengimport library yang diperlukan dan memuat dataset abstrak penelitian yang sudah dipreprocessing:

Dataset: hasil_preprocessing_abstrak.csv#

Dataset ini berisi abstrak-abstrak penelitian yang telah melalui proses preprocessing. Struktur data:

  • abstrak_id: Identifikasi unik untuk setiap abstrak penelitian

  • hasil_preprocessing: Teks abstrak yang sudah dibersihkan dan diproses

Karakteristik Data:#

  • Jumlah dokumen: 151 abstrak penelitian

  • Domain: Berbagai bidang penelitian (manajemen, teknologi, pendidikan, dll)

  • Bahasa: Indonesia

  • Format: Teks yang sudah dipreprocessing (tokenisasi, pembersihan, dll)

Library yang Digunakan:#

  • gensim.models: untuk Word2Vec dan FastText

  • pandas: untuk manipulasi data

  • sklearn.decomposition.PCA: untuk reduksi dimensi

  • matplotlib dan plotly: untuk visualisasi

  • numpy: untuk operasi numerik

from gensim.models import Word2Vec, FastText
import pandas as pd
import re

from sklearn.decomposition import PCA

from matplotlib import pyplot as plt
import plotly.graph_objects as go

import numpy as np

import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv('hasil_preprocessing_abstrak.csv')
df
abstrak_id hasil_preprocessing
0 ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt...
1 Aplikasi nyata pemanfaatan teknologi informasi... ['aplikasi', 'nyata', 'manfaat', 'teknologi', ...
2 Tujuan penelitian ini adalah untuk mengetahui ... ['tuju', 'teliti', 'persepsi', 'brand', 'assoc...
3 Abstrak\r\nPenelitian ini menggunakan metode k... ['abstrak', 'teliti', 'metode', 'kuantitatif',...
4 ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... ['abstrak', 'tuju', 'teliti', 'identifikasi', ...
... ... ...
1021 ABSTRAK\nPenelitian ini bertujuan untuk menget... ['abstrak', 'teliti', 'tuju', 'hitung', 'tingk...
1022 ABSTRAK\nUswatun Hasanah, 160211100291, Pengar... ['abstrak', 'uswatun', 'hasanah', 'pengaruh', ...
1023 ABSTRAK\nTujuan dari penelitian ini adalah unt... ['abstrak', 'tuju', 'teliti', 'peran', 'servic...
1024 ABSTRAK\nPenelitian ini bertujuan: (1) Untuk m... ['abstrak', 'teliti', 'tuju', 'baur', 'promosi...
1025 Penelitian ini bertujuan untuk dapat mengetahu... ['teliti', 'tuju', 'pengaruh', 'motivasi', 'ke...

1026 rows × 2 columns

3. Definisi Kelas Custom#

MyTokenizer#

Kelas untuk tokenisasi teks sederhana:

  • Mengubah teks menjadi lowercase

  • Memisahkan kata berdasarkan spasi

MeanEmbeddingVectorizer#

Kelas untuk mengubah teks menjadi vektor embedding:

  • Menggunakan model Word2Vec yang sudah dilatih

  • Mengambil rata-rata vektor kata untuk setiap dokumen

  • Menangani kata yang tidak ada dalam vocabulary

from gensim.models import Word2Vec

4. Preprocessing Teks Abstrak#

Membersihkan teks abstrak penelitian dengan:

  1. Konversi ke lowercase: Menyeragamkan format teks untuk konsistensi

  2. Menghapus punctuation: Menghilangkan tanda baca dan karakter non-alfabet

  3. Menghapus HTML tags: Membersihkan tag HTML jika ada dalam teks

  4. Menghapus digit dan karakter khusus: Membersihkan angka dan karakter non-alfabet

Tujuan Preprocessing:#

  • Menyeragamkan format teks untuk analisis yang lebih baik

  • Menghilangkan noise yang dapat mengganggu proses embedding

  • Mempersiapkan teks untuk tokenisasi yang efektif

Hasil preprocessing disimpan dalam kolom ‘clean’.

import numpy as np

class MyTokenizer:
    def fit_transform(self, texts):
        # Tokenisasi sederhana: lowercase + split
        return [str(text).lower().split() for text in texts]

class MeanEmbeddingVectorizer:
    def __init__(self, word2vec_model):
        self.word2vec = word2vec_model
        # Perbaikan: gunakan vector_size (Gensim ≥ 4.0)
        self.dim = word2vec_model.wv.vector_size

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        X_tokenized = MyTokenizer().fit_transform(X)
        embeddings = []
        for words in X_tokenized:
            # Ambil vektor hanya untuk kata yang ada di vocab
            valid_vectors = [
                self.word2vec.wv[word] for word in words
                if word in self.word2vec.wv
            ]
            if valid_vectors:
                embeddings.append(np.mean(valid_vectors, axis=0))
            else:
                embeddings.append(np.zeros(self.dim))
        return np.array(embeddings)

    def fit_transform(self, X, y=None):
        return self.transform(X)

5. Pembuatan Corpus dan Training Word2Vec#

Pembuatan Corpus dari Abstrak#

  • Memecah teks abstrak yang sudah dibersihkan menjadi list kata

  • Setiap abstrak penelitian menjadi list kata terpisah

  • Corpus akan digunakan untuk melatih model Word2Vec

Training Model Word2Vec untuk Abstrak#

  • Arsitektur: CBOW (Continuous Bag of Words)

  • min_count=1: Termasuk semua kata (bahkan yang muncul sekali)

  • vector_size=56: Dimensi vektor embedding 56

  • Window: Konteks kata di sekitar kata target (default 5)

  • Model akan mempelajari representasi vektor untuk setiap kata berdasarkan konteksnya dalam abstrak penelitian

Keunggulan CBOW untuk Abstrak:#

  • Efektif untuk dataset kecil seperti abstrak penelitian

  • Mampu menangkap makna kata dalam konteks akademik

  • Cocok untuk analisis similaritas semantik antar penelitian

clean_txt = []
for w in range(len(df['hasil_preprocessing'])):
   desc = str(df['hasil_preprocessing'][w]).lower()

   #remove punctuation
   desc = re.sub('[^a-zA-Z]', ' ', desc)

   #remove tags
   desc=re.sub("</?.*?>"," <> ",desc)

   #remove digits and special chars
   desc=re.sub("(\\d|\\W)+"," ",desc)
   clean_txt.append(desc)

df['clean'] = clean_txt
df.head()
abstrak_id hasil_preprocessing clean
0 ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... abstrak satiyah pengaruh faktorfaktor latih k...
1 Aplikasi nyata pemanfaatan teknologi informasi... ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... aplikasi nyata manfaat teknologi informasi ko...
2 Tujuan penelitian ini adalah untuk mengetahui ... ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... tuju teliti persepsi brand association langga...
3 Abstrak\r\nPenelitian ini menggunakan metode k... ['abstrak', 'teliti', 'metode', 'kuantitatif',... abstrak teliti metode kuantitatif tekan uji h...
4 ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... ['abstrak', 'tuju', 'teliti', 'identifikasi', ... abstrak tuju teliti identifikasi variabelvari...

6. Eksplorasi Model Word2Vec untuk Abstrak#

Analisis Similaritas Kata dalam Konteks Akademik#

  • most_similar(): Mencari kata yang paling mirip dengan kata probe dalam konteks penelitian

  • most_similar_cosmul(): Mencari kata yang mirip dengan kombinasi kata positif dan negatif

  • doesnt_match(): Mencari kata yang tidak cocok dalam sekelompok kata terkait penelitian

Eksplorasi Vocabulary Abstrak#

  • Model akan mempelajari kata-kata khas dalam abstrak penelitian

  • Terminologi akademik dan teknis akan memiliki representasi vektor yang bermakna

  • Kata-kata seperti “penelitian”, “analisis”, “metode” akan memiliki similaritas tinggi

Penyimpanan Embedding#

  • Menyimpan vektor embedding dalam format Word2Vec

  • File: abstrak_embd.txt (format teks, bukan binary)

  • Embedding dapat digunakan untuk analisis lebih lanjut atau model lain

df.shape
(1026, 3)

7. Ekstraksi Embedding untuk Abstrak Penelitian#

Menggunakan MeanEmbeddingVectorizer untuk mengubah setiap abstrak penelitian menjadi vektor:

  • Input: Teks abstrak yang sudah dibersihkan

  • Proses:

    1. Tokenisasi teks abstrak menjadi kata-kata

    2. Ambil vektor embedding untuk setiap kata dari model Word2Vec

    3. Hitung rata-rata vektor kata untuk mendapatkan representasi abstrak

  • Output: Vektor 56 dimensi untuk setiap abstrak penelitian

Keunggulan Mean Embedding untuk Abstrak:#

  • Menangkap makna keseluruhan abstrak penelitian

  • Mempertahankan informasi semantik dari terminologi akademik

  • Cocok untuk analisis similaritas antar penelitian

  • Memungkinkan clustering abstrak berdasarkan topik penelitian

corpus = []
for col in df.clean:
   word_list = col.split(" ")
   corpus.append(word_list)

#show first value
corpus[0:1]

#generate vectors from corpus
model = Word2Vec(corpus, min_count=1, vector_size = 56)

8. Validasi Embedding#

Memeriksa panjang embedding untuk memastikan konsistensi:

  • Setiap dokumen harus memiliki vektor dengan panjang 56 (sesuai dengan vector_size)

  • Ini memastikan bahwa proses embedding berjalan dengan benar

# Explore embeddings safely using an in-vocabulary token
# Pick a common Indonesian token if available, else fallback to the first vocab token
candidate_tokens = ['indonesia', 'pemerintah', 'jakarta', 'presiden', 'ekonomi']
probe = None
for tok in candidate_tokens:
    if tok in model.wv:
        probe = tok
        break
if probe is None:
    probe = model.wv.index_to_key[0]

print('Probe token:', probe)
print('Top similar:')
print(model.wv.most_similar(probe)[:10])

# Optional: cosine mul example if tokens exist
pos = [t for t in ['pemerintah', 'indonesia'] if t in model.wv]
neg = [t for t in ['oposisi'] if t in model.wv]
if pos:
    print('Cosmul example:')
    print(model.wv.most_similar_cosmul(positive=pos, negative=neg)[:10])

# Optional: doesnt_match example when enough tokens exist
cands = [t for t in ['ekonomi', 'politik', 'olahraga', 'jakarta'] if t in model.wv]
if len(cands) >= 3:
    print('Odd-one-out:')
    print(model.wv.doesnt_match(cands))

# Save embeddings
filename = 'abstrak_embd.txt'
model.wv.save_word2vec_format(filename, binary=False)
Probe token: indonesia
Top similar:
[('efek', 0.958017110824585), ('bursa', 0.9447913765907288), ('devisa', 0.9344190955162048), ('bei', 0.9310687780380249), ('daftar', 0.9256938099861145), ('periode', 0.921766459941864), ('kaca', 0.9186773300170898), ('estate', 0.9085423946380615), ('go', 0.9027281999588013), ('transportasi', 0.8972045183181763)]
Cosmul example:
[('efek', 0.9790076613426208), ('bursa', 0.9723947048187256), ('devisa', 0.9672086834907532), ('bei', 0.9655334949493408), ('daftar', 0.962846040725708), ('periode', 0.9608823657035828), ('kaca', 0.9593377709388733), ('estate', 0.9542703032493591), ('go', 0.951363205909729), ('transportasi', 0.9486013650894165)]
Odd-one-out:
ekonomi

9. Konversi Embedding ke DataFrame#

Mengubah array embedding abstrak menjadi DataFrame dengan kolom terpisah:

  • Input: Array embedding 2D (151 abstrak penelitian × 56 fitur)

  • Proses:

    1. Membuat kolom f1, f2, …, f56 untuk setiap dimensi embedding

    2. Mengisi setiap kolom dengan nilai dari dimensi yang sesuai

  • Output: DataFrame dengan 151 baris dan 56 kolom fitur

  • Tujuan: Memudahkan analisis dan visualisasi data abstrak penelitian

Manfaat Format DataFrame:#

  • Memudahkan analisis statistik pada setiap dimensi embedding

  • Kompatibel dengan library machine learning seperti scikit-learn

  • Memungkinkan visualisasi distribusi fitur per kategori penelitian

  • Memudahkan ekspor data untuk analisis lebih lanjut

12. Visualisasi Embedding Abstrak Penelitian#

Menambahkan visualisasi untuk menganalisis hasil embedding abstrak penelitian:

  • PCA Visualization: Reduksi dimensi untuk visualisasi 2D abstrak penelitian

  • Similarity Heatmap: Matriks similaritas antar abstrak penelitian

  • Embedding Distribution: Distribusi nilai embedding per kategori penelitian

  • Category Analysis: Analisis embedding berdasarkan bidang penelitian

  • Word Similarity Network: Jaringan similaritas kata dalam konteks akademik

Tujuan Visualisasi:#

  • Memahami pola distribusi abstrak penelitian dalam ruang embedding

  • Mengidentifikasi cluster penelitian berdasarkan topik

  • Menganalisis similaritas semantik antar penelitian

  • Memvalidasi kualitas embedding yang dihasilkan

mean_embedding_vectorizer = MeanEmbeddingVectorizer(model)
mean_embedded = mean_embedding_vectorizer.fit_transform(df['clean'])

10. Penambahan Label (Opsional)#

Mencoba menambahkan kolom label jika tersedia:

  • Mencari kolom ‘kategori’ dalam DataFrame asli

  • Jika ditemukan, menyalin label ke DataFrame embedding

  • Jika tidak ditemukan, memberikan peringatan

Catatan: Label diperlukan untuk supervised learning atau evaluasi model.

df['array']=list(mean_embedded)

11. Hasil Akhir#

Ringkasan Proses CBOW Embedding untuk Abstrak:#

  1. Preprocessing: Membersihkan teks abstrak penelitian

  2. Training Word2Vec: Membuat model CBOW dengan 56 dimensi

  3. Ekstraksi Embedding: Mengubah abstrak penelitian menjadi vektor numerik

  4. Konversi DataFrame: Mengubah array menjadi format tabular

  5. Visualisasi: Analisis pola dan distribusi embedding

Output yang Dihasilkan:#

  • DataFrame embedding: 151 baris × 56 kolom fitur

  • File embedding: abstrak_embd.txt (format Word2Vec)

  • Model Word2Vec: Siap digunakan untuk analisis similaritas kata dalam konteks akademik

  • Visualisasi: PCA, heatmap, dan network analysis

Aplikasi Selanjutnya untuk Abstrak Penelitian:#

  • Clustering abstrak: Mengelompokkan penelitian berdasarkan topik

  • Klasifikasi bidang penelitian: Mengkategorikan abstrak berdasarkan domain

  • Analisis similaritas penelitian: Mencari penelitian yang mirip

  • Visualisasi embedding: PCA/t-SNE untuk eksplorasi pola penelitian

  • Recommendation system: Mencari penelitian terkait berdasarkan embedding

df.head(5)
abstrak_id hasil_preprocessing clean array
0 ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... abstrak satiyah pengaruh faktorfaktor latih k... [0.36548746, 0.716385, 0.15957196, -0.3679199,...
1 Aplikasi nyata pemanfaatan teknologi informasi... ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... aplikasi nyata manfaat teknologi informasi ko... [0.16742007, 0.5279538, -0.11527466, -0.279942...
2 Tujuan penelitian ini adalah untuk mengetahui ... ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... tuju teliti persepsi brand association langga... [0.15432383, 0.6964137, -0.41081175, -0.452757...
3 Abstrak\r\nPenelitian ini menggunakan metode k... ['abstrak', 'teliti', 'metode', 'kuantitatif',... abstrak teliti metode kuantitatif tekan uji h... [0.58658457, 1.0527209, -0.061899975, -0.90006...
4 ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... ['abstrak', 'tuju', 'teliti', 'identifikasi', ... abstrak tuju teliti identifikasi variabelvari... [0.31359524, 0.8989767, -0.098680854, -0.85267...
df['embedding_length'] = df['array'].str.len()
print(df['embedding_length'])
0       56
1       56
2       56
3       56
4       56
        ..
1021    56
1022    56
1023    56
1024    56
1025    56
Name: embedding_length, Length: 1026, dtype: int64
df.shape
(1026, 5)
num_features = len(df['array'].iloc[0])  # asumsi semua list punya panjang sama
columns = [f'f{i+1}' for i in range(num_features)]

# Inisialisasi dictionary untuk menampung data per kolom
data_dict = {col: [] for col in columns}

# Looping setiap baris di kolom 'embedding'
for embedding_list in df['array']:
    for i, value in enumerate(embedding_list):
        data_dict[f'f{i+1}'].append(value)

# Buat DataFrame dari dictionary
embedding_df = pd.DataFrame(data_dict)

embedding_df
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 ... f47 f48 f49 f50 f51 f52 f53 f54 f55 f56
0 0.365487 0.716385 0.159572 -0.367920 0.224299 -0.008584 0.361405 -0.523220 0.168144 0.046363 ... 0.643608 0.964336 0.065046 0.633086 -0.098266 0.852551 0.207564 0.639124 -0.007177 -0.618843
1 0.167420 0.527954 -0.115275 -0.279942 -0.004662 -0.102450 0.611674 -0.386023 -0.035535 0.173587 ... 0.416687 0.591297 0.133505 0.607659 0.183871 0.454613 -0.190961 0.609408 0.242703 -0.334897
2 0.154324 0.696414 -0.410812 -0.452758 0.050656 -0.123596 0.688204 -0.365594 -0.126446 0.134907 ... 0.756657 0.529345 0.043140 0.527827 0.344219 0.514495 -0.303969 0.789283 0.346497 -0.363010
3 0.586585 1.052721 -0.061900 -0.900069 0.297022 0.291881 0.512259 -0.638588 0.400413 0.090068 ... 1.066514 1.110524 -0.018310 0.830326 -0.144583 0.871703 0.396844 0.809948 0.020211 -0.725453
4 0.313595 0.898977 -0.098681 -0.852672 0.224413 -0.075044 0.736564 -0.296571 0.440990 0.380296 ... 1.118501 0.740074 -0.085555 1.228455 0.000684 0.714946 0.184974 0.787050 0.521311 -0.432489
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1021 0.073671 0.608046 -0.054002 -0.270766 -0.107290 0.000393 0.268269 -0.602032 0.010310 -0.129304 ... 0.264000 0.426607 0.053954 0.253736 0.133076 0.452963 -0.039510 0.589059 0.345337 -0.548607
1022 0.593354 1.037423 0.422915 -0.712085 0.214765 0.166399 0.054129 -0.901139 0.624075 -0.019217 ... 0.743601 1.158916 0.115424 0.966210 -0.372967 1.069085 0.624109 0.513385 -0.000435 -1.011996
1023 0.350669 0.940788 -0.331761 -0.749276 0.028689 0.161183 0.615456 -0.641041 0.224344 0.058748 ... 0.841594 0.721994 0.036967 0.583049 0.150275 0.597719 0.055457 0.764084 0.274789 -0.650594
1024 -0.126984 0.728735 0.106582 -0.529795 0.202731 -0.182372 0.762032 -0.251091 0.195888 0.301766 ... 0.835412 0.552028 -0.214962 1.344962 0.088150 0.517858 0.026125 0.700737 0.763998 -0.047956
1025 0.679734 0.705006 0.270415 -0.366951 0.314789 0.088967 0.257736 -0.583103 0.152048 -0.025278 ... 0.697545 1.217594 0.119447 0.769881 -0.186109 0.946621 0.105962 0.677135 -0.139797 -0.689392

1026 rows × 56 columns

# Cek apakah ada kolom label yang tersedia pada df
possible_labels = ['kategori', 'category', 'label', 'bidang', 'domain']
label_col = None
for c in possible_labels:
    if c in df.columns:
        label_col = c
        break

if label_col is not None:
    embedding_df[label_col] = df[label_col].values
    print(f'✅ Kolom label "{label_col}" berhasil ditambahkan ke embedding_df')
else:
    print('ℹ️  Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.')
    print('   Kolom yang tersedia di df:', list(df.columns))
ℹ️  Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.
   Kolom yang tersedia di df: ['abstrak_id', 'hasil_preprocessing', 'clean', 'array', 'embedding_length']
embedding_df
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 ... f47 f48 f49 f50 f51 f52 f53 f54 f55 f56
0 0.365487 0.716385 0.159572 -0.367920 0.224299 -0.008584 0.361405 -0.523220 0.168144 0.046363 ... 0.643608 0.964336 0.065046 0.633086 -0.098266 0.852551 0.207564 0.639124 -0.007177 -0.618843
1 0.167420 0.527954 -0.115275 -0.279942 -0.004662 -0.102450 0.611674 -0.386023 -0.035535 0.173587 ... 0.416687 0.591297 0.133505 0.607659 0.183871 0.454613 -0.190961 0.609408 0.242703 -0.334897
2 0.154324 0.696414 -0.410812 -0.452758 0.050656 -0.123596 0.688204 -0.365594 -0.126446 0.134907 ... 0.756657 0.529345 0.043140 0.527827 0.344219 0.514495 -0.303969 0.789283 0.346497 -0.363010
3 0.586585 1.052721 -0.061900 -0.900069 0.297022 0.291881 0.512259 -0.638588 0.400413 0.090068 ... 1.066514 1.110524 -0.018310 0.830326 -0.144583 0.871703 0.396844 0.809948 0.020211 -0.725453
4 0.313595 0.898977 -0.098681 -0.852672 0.224413 -0.075044 0.736564 -0.296571 0.440990 0.380296 ... 1.118501 0.740074 -0.085555 1.228455 0.000684 0.714946 0.184974 0.787050 0.521311 -0.432489
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1021 0.073671 0.608046 -0.054002 -0.270766 -0.107290 0.000393 0.268269 -0.602032 0.010310 -0.129304 ... 0.264000 0.426607 0.053954 0.253736 0.133076 0.452963 -0.039510 0.589059 0.345337 -0.548607
1022 0.593354 1.037423 0.422915 -0.712085 0.214765 0.166399 0.054129 -0.901139 0.624075 -0.019217 ... 0.743601 1.158916 0.115424 0.966210 -0.372967 1.069085 0.624109 0.513385 -0.000435 -1.011996
1023 0.350669 0.940788 -0.331761 -0.749276 0.028689 0.161183 0.615456 -0.641041 0.224344 0.058748 ... 0.841594 0.721994 0.036967 0.583049 0.150275 0.597719 0.055457 0.764084 0.274789 -0.650594
1024 -0.126984 0.728735 0.106582 -0.529795 0.202731 -0.182372 0.762032 -0.251091 0.195888 0.301766 ... 0.835412 0.552028 -0.214962 1.344962 0.088150 0.517858 0.026125 0.700737 0.763998 -0.047956
1025 0.679734 0.705006 0.270415 -0.366951 0.314789 0.088967 0.257736 -0.583103 0.152048 -0.025278 ... 0.697545 1.217594 0.119447 0.769881 -0.186109 0.946621 0.105962 0.677135 -0.139797 -0.689392

1026 rows × 56 columns

embedding_df.shape
(1026, 56)
# 1. PCA Visualization untuk Embedding Abstrak
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

try:
    # Cek apakah embedding_df sudah ada
    if 'embedding_df' not in locals():
        print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
    else:
        print("📊 Membuat PCA visualization untuk embedding abstrak penelitian...")
        print(f"   Shape embedding_df: {embedding_df.shape}")
        
        # Reduksi dimensi dengan PCA
        pca = PCA(n_components=2)
        embedding_2d = pca.fit_transform(embedding_df.iloc[:, :])  # Gunakan semua kolom fitur
        
        # Visualisasi dengan Matplotlib (tanpa kategori karena tidak tersedia)
        plt.figure(figsize=(12, 8))
        
        # Plot semua titik dengan warna yang sama karena tidak ada kategori
        scatter = plt.scatter(embedding_2d[:, 0], embedding_2d[:, 1], 
                             c='blue', alpha=0.7, s=50, label='Abstrak Penelitian')
        
        plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} variance)', fontsize=12)
        plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} variance)', fontsize=12)
        plt.title('PCA Visualization of Abstract Research Embeddings', fontsize=14)
        plt.legend(fontsize=12)
        plt.grid(True, alpha=0.3)
        
        # Tambahkan informasi tambahan
        plt.text(0.02, 0.98, f'Total abstrak: {len(embedding_2d)}', 
                transform=plt.gca().transAxes, fontsize=10, 
                verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))
        
        plt.tight_layout()
        plt.show()
        
        # Statistik PCA
        print(f"\n📈 Statistik PCA:")
        print(f"   Explained variance ratio - PC1: {pca.explained_variance_ratio_[0]:.3f}")
        print(f"   Explained variance ratio - PC2: {pca.explained_variance_ratio_[1]:.3f}")
        print(f"   Total explained variance: {pca.explained_variance_ratio_.sum():.3f}")
        print(f"   Jumlah abstrak penelitian: {len(embedding_2d)}")
        print(f"   Dimensi asli: {embedding_df.shape[1]}")
        print(f"   Dimensi setelah PCA: {embedding_2d.shape[1]}")
        
except Exception as e:
    print(f"❌ Error: {e}")
    print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat PCA visualization untuk embedding abstrak penelitian...
   Shape embedding_df: (1026, 56)
_images/a3f7c4d13fa51c2d90ccbbb22c0c954d1f1b393b1fe495595839aa5830dad9f0.png
📈 Statistik PCA:
   Explained variance ratio - PC1: 0.489
   Explained variance ratio - PC2: 0.214
   Total explained variance: 0.703
   Jumlah abstrak penelitian: 1026
   Dimensi asli: 56
   Dimensi setelah PCA: 2
# 2. Similarity Heatmap untuk beberapa abstrak penelitian
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

try:
    # Cek apakah embedding_df sudah ada
    if 'embedding_df' not in locals():
        print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
    else:
        # Ambil sample 20 abstrak untuk heatmap
        sample_size = min(20, len(embedding_df))
        sample_indices = np.random.choice(len(embedding_df), sample_size, replace=False)
        sample_embeddings = embedding_df.iloc[sample_indices, :]  # Gunakan semua kolom fitur
        
        print(f"📊 Membuat similarity heatmap untuk {sample_size} abstrak penelitian...")
        print(f"   Shape sample embeddings: {sample_embeddings.shape}")
        
        # Hitung cosine similarity
        similarity_matrix = cosine_similarity(sample_embeddings)
        
        # Visualisasi heatmap dengan Matplotlib
        plt.figure(figsize=(12, 10))
        im = plt.imshow(similarity_matrix, cmap='viridis', aspect='auto', vmin=0, vmax=1)
        plt.colorbar(im, label='Cosine Similarity')
        plt.title('Cosine Similarity Matrix of Abstract Research Embeddings (Sample)', fontsize=14)
        plt.xlabel('Abstract Index', fontsize=12)
        plt.ylabel('Abstract Index', fontsize=12)
        
        # Tambahkan label indeks abstrak
        for i in range(sample_size):
            plt.text(i, -0.5, f'A{i+1}', rotation=45, ha='right', va='top', fontsize=8)
            plt.text(-0.5, i, f'A{i+1}', rotation=0, ha='right', va='center', fontsize=8)
        
        # Tambahkan grid untuk memudahkan membaca
        plt.grid(True, alpha=0.3)
        plt.tight_layout()
        plt.show()
        
        # Statistik similarity
        print(f"\n📈 Statistik Similarity Matrix:")
        print(f"   Shape: {similarity_matrix.shape}")
        print(f"   Average similarity: {similarity_matrix.mean():.3f}")
        print(f"   Max similarity: {similarity_matrix.max():.3f}")
        print(f"   Min similarity: {similarity_matrix.min():.3f}")
        print(f"   Standard deviation: {similarity_matrix.std():.3f}")
        
        # Cari pasangan abstrak yang paling similar
        np.fill_diagonal(similarity_matrix, 0)  # Hapus diagonal (similarity dengan diri sendiri)
        max_sim_idx = np.unravel_index(np.argmax(similarity_matrix), similarity_matrix.shape)
        print(f"   Most similar pair: A{max_sim_idx[0]+1} & A{max_sim_idx[1]+1} (similarity: {similarity_matrix[max_sim_idx]:.3f})")
        
except Exception as e:
    print(f"❌ Error: {e}")
    print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat similarity heatmap untuk 20 abstrak penelitian...
   Shape sample embeddings: (20, 56)
_images/e6c0735625441c3ac0d841a8e1000f0f2edaf06bcd13a13acfe324ba326743f6.png
📈 Statistik Similarity Matrix:
   Shape: (20, 20)
   Average similarity: 0.803
   Max similarity: 1.000
   Min similarity: 0.395
   Standard deviation: 0.132
   Most similar pair: A7 & A11 (similarity: 0.990)
# 3. Distribusi Embedding untuk Abstrak Penelitian
import matplotlib.pyplot as plt
import numpy as np

try:
    # Cek apakah embedding_df sudah ada
    if 'embedding_df' not in locals():
        print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
    else:
        print("📊 Membuat distribusi embedding untuk abstrak penelitian...")
        
        fig, axes = plt.subplots(2, 2, figsize=(15, 10))
        axes = axes.ravel()
        
        # Ambil beberapa fitur untuk dianalisis
        feature_cols = ['f1', 'f2', 'f3', 'f4']
        
        for i, feature in enumerate(feature_cols):
            # Plot distribusi untuk semua abstrak (tanpa kategori)
            data = embedding_df[feature]
            axes[i].hist(data, alpha=0.7, color='skyblue', bins=20, edgecolor='black')
            
            axes[i].set_title(f'Distribution of {feature} for Abstract Research', fontsize=12)
            axes[i].set_xlabel(f'{feature} Value', fontsize=10)
            axes[i].set_ylabel('Frequency', fontsize=10)
            axes[i].grid(True, alpha=0.3)
            
            # Tambahkan statistik
            mean_val = data.mean()
            std_val = data.std()
            axes[i].axvline(mean_val, color='red', linestyle='--', linewidth=2, label=f'Mean: {mean_val:.3f}')
            axes[i].axvline(mean_val + std_val, color='orange', linestyle=':', linewidth=2, label=f'±1σ: {std_val:.3f}')
            axes[i].axvline(mean_val - std_val, color='orange', linestyle=':', linewidth=2)
            axes[i].legend(fontsize=9)
        
        plt.suptitle('Distribution of Embedding Features for Abstract Research', fontsize=14)
        plt.tight_layout()
        plt.show()
        
        # Statistik detail
        print(f"\n📈 Statistik Distribusi Embedding untuk 4 fitur pertama:")
        print("-" * 60)
        for feature in feature_cols:
            data = embedding_df[feature]
            print(f"{feature:>3}: Mean={data.mean():>7.3f}, Std={data.std():>7.3f}, Min={data.min():>7.3f}, Max={data.max():>7.3f}")
        
        # Statistik keseluruhan
        all_features = embedding_df.columns
        print(f"\n📊 Statistik Keseluruhan ({len(all_features)} fitur):")
        print(f"   Mean keseluruhan: {embedding_df.values.mean():.3f}")
        print(f"   Std keseluruhan: {embedding_df.values.std():.3f}")
        print(f"   Min keseluruhan: {embedding_df.values.min():.3f}")
        print(f"   Max keseluruhan: {embedding_df.values.max():.3f}")
        
except Exception as e:
    print(f"❌ Error: {e}")
    print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat distribusi embedding untuk abstrak penelitian...
_images/b3382c46e6572b276315442af240a1212f2859d1ae32c913225f7b2a4b475977.png
📈 Statistik Distribusi Embedding untuk 4 fitur pertama:
------------------------------------------------------------
 f1: Mean=  0.209, Std=  0.336, Min= -0.474, Max=  1.020
 f2: Mean=  0.878, Std=  0.173, Min=  0.271, Max=  1.341
 f3: Mean= -0.001, Std=  0.242, Min= -0.715, Max=  0.634
 f4: Mean= -0.500, Std=  0.210, Min= -1.127, Max=  0.093

📊 Statistik Keseluruhan (56 fitur):
   Mean keseluruhan: 0.053
   Std keseluruhan: 0.576
   Min keseluruhan: -2.298
   Max keseluruhan: 2.291
# 5. Analisis Similaritas Kata dengan Word2Vec
# Ambil beberapa kata yang ada dalam vocabulary
vocab_words = list(model.wv.key_to_index.keys())[:20]  # Ambil 20 kata pertama

# Hitung similarity matrix untuk kata-kata
word_similarities = []
for word1 in vocab_words:
    row = []
    for word2 in vocab_words:
        if word1 in model.wv and word2 in model.wv:
            similarity = model.wv.similarity(word1, word2)
            row.append(similarity)
        else:
            row.append(0)
    word_similarities.append(row)

word_similarities = np.array(word_similarities)

# Visualisasi heatmap similarity kata
plt.figure(figsize=(12, 10))
plt.imshow(word_similarities, cmap='viridis', aspect='auto')
plt.colorbar(label='Word Similarity')
plt.title('Word Similarity Matrix (Word2Vec)')
plt.xlabel('Words')
plt.ylabel('Words')

# Set labels
plt.xticks(range(len(vocab_words)), vocab_words, rotation=45, ha='right')
plt.yticks(range(len(vocab_words)), vocab_words)

plt.tight_layout()
plt.show()

print(f"Vocabulary size: {len(model.wv.key_to_index)}")
print(f"Sample words: {vocab_words[:10]}")
_images/ff5e1cd8b244b8c29220de2811b44db7a8e443da04d158b784cae62d0f056cb2.png
Vocabulary size: 6500
Sample words: ['pengaruh', 'kerja', 'teliti', 'variabel', 'usaha', 'signifikan', 'uji', 'karyawan', '', 'nilai']
# Test Plotly setelah install nbformat
import plotly.express as px
import pandas as pd
import numpy as np

# Buat data test sederhana
test_data = pd.DataFrame({
    'x': np.random.randn(10),
    'y': np.random.randn(10),
    'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C']
})

# Test plotly
fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly')
fig.show()

print("✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.")
✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.
# Solusi 2: Install ulang library di dalam notebook
import sys
!{sys.executable} -m pip install --upgrade nbformat ipython
Requirement already satisfied: nbformat in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (5.10.4)
Requirement already satisfied: ipython in c:\users\user\appdata\roaming\python\python311\site-packages (9.6.0)
Requirement already satisfied: fastjsonschema>=2.15 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (2.21.2)
Requirement already satisfied: jsonschema>=2.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (4.25.1)
Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.8.1)
Requirement already satisfied: traitlets>=5.1 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.14.3)
Requirement already satisfied: colorama in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (0.4.6)
Requirement already satisfied: decorator in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (5.2.1)
Requirement already satisfied: ipython-pygments-lexers in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (1.1.1)
Requirement already satisfied: jedi>=0.16 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.19.2)
Requirement already satisfied: matplotlib-inline in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.1.7)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (3.0.52)
Requirement already satisfied: pygments>=2.4.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (2.19.2)
Requirement already satisfied: stack_data in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.6.3)
Requirement already satisfied: typing_extensions>=4.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (4.15.0)
Requirement already satisfied: wcwidth in c:\users\user\appdata\roaming\python\python311\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython) (0.2.14)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\users\user\appdata\roaming\python\python311\site-packages (from jedi>=0.16->ipython) (0.8.5)
Requirement already satisfied: attrs>=22.2.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (2025.9.1)
Requirement already satisfied: referencing>=0.28.4 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.27.1)
Requirement already satisfied: platformdirs>=2.5 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (4.4.0)
Requirement already satisfied: pywin32>=300 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (311)
Requirement already satisfied: executing>=1.2.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (2.2.1)
Requirement already satisfied: asttokens>=2.1.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (3.0.0)
Requirement already satisfied: pure-eval in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (0.2.3)
# Solusi 3: Set renderer plotly yang berbeda
import plotly.io as pio

# Coba beberapa renderer yang berbeda
try:
    # Renderer untuk Jupyter notebook
    pio.renderers.default = "notebook"
    print("✅ Renderer set ke 'notebook'")
except:
    try:
        # Renderer untuk browser
        pio.renderers.default = "browser"
        print("✅ Renderer set ke 'browser'")
    except:
        # Renderer HTML
        pio.renderers.default = "html"
        print("✅ Renderer set ke 'html'")

# Test dengan data sederhana
import plotly.express as px
import pandas as pd
import numpy as np

test_data = pd.DataFrame({
    'x': [1, 2, 3, 4, 5],
    'y': [2, 4, 1, 3, 5],
    'category': ['A', 'B', 'A', 'C', 'B']
})

fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly dengan Renderer Baru')
fig.show()
✅ Renderer set ke 'notebook'